// encode = "gb2312"
#include "stdlib.h"
#include "pthread.h"
#include "stdio.h"
#include "semaphore.h"
#include "sys/time.h"
#include <unistd.h>

#define NUM_THREADS 2            //线程池中同时存在的线程数
#define MAX_TASK_NUM 5           // task队列最大存储数
#define BLOCK_TIME_LIMIT 5000000 //线程阻塞超时时间，单位为纳秒

#define TRUE 1
#define FALSE 0

//队列信号量
typedef struct staconv
{
    pthread_mutex_t mutex;
    pthread_cond_t cond;      /*用于阻塞和唤醒线程池中线程*/
    pthread_condattr_t cattr; /*配合cond使用，把绝对时间阻塞改为相对时间阻塞*/
    int status;
    /*表示任务队列状态:false 为无任务;true 为有任务*/
} staconv;

/*Task*/
typedef struct task
{
    struct task *next;
    /* 指向下一任务 */
    void (*function)(void *arg); /* 函数指针 */
    void *arg;                   /* 函数参数指针 */
} task;

/*Task Queue*/
typedef struct taskqueue
{
    pthread_mutex_t mutex; /* 用于互斥读写任务队列 */
    task *front;           /* 指向队首 */
    task *rear;            /* 指向队尾 */
    staconv *has_jobs;     /* 根据状态,阻塞线程 */
    int len;               /* 队列中任务个数 */
} taskqueue;

/* Thread */
typedef struct thread
{
    int id;                  /* 线程 id */
    pthread_t pthread;       /* 封装的 POSIX 线程 */
    struct threadpool *pool; /* 与线程池绑定 */
} thread;

/*Thread Pool*/
typedef struct threadpool
{
    int type;                        //对应不同线程池
    thread **threads;                /* 线程指针数组 */
    volatile int num_threads;        /* 线程池中线程数量 */
    volatile int num_working;        /* 目前正在工作的线程个数 */
    pthread_mutex_t thcount_lock;    /* 线程池锁用于修改上面两个变量 */
    pthread_cond_t threads_all_idle; /* 用于销毁线程的条件变量 */
    taskqueue queue;
    volatile int is_alive;
} threadpool;

struct threadpool *initTheadPool(int num_threads);                           /*线程池初始化函数*/
void addTask2ThreadPool(threadpool *pool, task *curtask);                    /*向线程池中添加任务*/
